fasteval:=proc(P,A,B,i)
	#P : poly
	#A : liste
	#B: arbre
	#i : hauteur de l'arbre
	local P0, P1, L0, L1, n, w, At;
	n := nops(A);
	if n=1 then 
		return eval(P,x=A[1]);
	fi;
	#P0:=division(P,B[i-1,j],x)[2];
	#P1:=division(P,B[i-1,j+1],x)[2];
	P0:=op(2,[division(P,B[i-1,0],x)]);
	#print("calcul de P0",P0);
	P1:=op(2,[division(P,B[i-1,1],x)]);
	#print("calcul de P1",P1);
	
	At:=[seq(A[w], w=1..(n/2))];
	#print("Calcul de L0: premier appel recursif");
	L0:=fasteval(P0,At,init_arbre(At,n/2,i-1),i-1):
	At:=[seq(A[w], w=((n/2)+1)..n)];
	#print("calcul de L1: second appel recursif");
	L1:=fasteval(P1,At,init_arbre(At,n/2,i-1),i-1):

	return L0,L1:
end;


fasteval2:=proc(P,A,B)
	#P : poly
	#A : liste
	#B: arbre
	#i : hauteur de l'arbre
	local P0, P1, L0, L1, n, w, At;
	n := nops(A);
	if n=1 then 
		return eval(P,x=A[1]);
	fi;
	#P0:=division(P,B[i-1,j],x)[2];
	#P1:=division(P,B[i-1,j+1],x)[2];
	P0:=op(2,[division(P,B[2][1],x)]);
	#print("calcul de P0",P0);
	P1:=op(2,[division(P,B[3][1],x)]);
	#print("calcul de P1",P1);
	
	At:=[seq(A[w], w=1..(n/2))];
	#print("Calcul de L0: premier appel recursif");
	L0:=fasteval2(P0,At,B[2]):
	At:=[seq(A[w], w=((n/2)+1)..n)];
	#print("calcul de L1: second appel recursif");
	L1:=fasteval2(P1,At,B[3]):

	return L0,L1:
end;
